﻿Public Class frmMicheline
    ' La simulation en elle-même
    Public Simulation As New Simulation

    ' Notre "magnifique" assistante roumaine pas cher
    Public Assistant As Assistant

    Private Sub pbSimulation_MouseUp(sender As Object, e As MouseEventArgs) Handles pbSimulation.MouseUp
        ' Si la simulation est en cours, on ne gère pas les clics
        If SimulationTick.Enabled Then Return

        ' Retransmet l'évènement de déplacement à la simlation
        Simulation.Move(e.X, e.Y)
        Simulation.StopMoving()
        ' Rafraichissement de l'affichage
        pbSimulation.Refresh()
    End Sub

    Private Sub pbSimulation_MouseMove(sender As Object, e As MouseEventArgs) Handles pbSimulation.MouseMove
        ' Gère les survols d'objets (stations, jonctions, trains)
        Simulation.HighlightHovered(e.X, e.Y)
        ' Gère le déplacement d'objets
        Simulation.Move(e.X, e.Y)
        ' Puis met à jour les graphismes
        pbSimulation.Refresh()
    End Sub

    Private Sub pbSimulation_Paint(sender As Object, e As PaintEventArgs) Handles pbSimulation.Paint
        ' Affichage de la simulation
        Simulation.Draw(e.Graphics)

        ' Et si l'affichage de l'assistant est activé, on dessine
        If tsbAssistant.Checked = True Then
            Assistant.Draw(e.Graphics, pbSimulation.Width)
        End If
    End Sub

    Private Sub AssistantTick_Tick(sender As Object, e As EventArgs) Handles AssistantTick.Tick
        ' Permet d'animer l'assistant au démarrage
        Assistant.Tick()
        pbSimulation.Refresh()
        ' Arrête le timer après 6 secondes
        If Assistant.TickCount > 60 Then AssistantTick.Stop()
    End Sub

    Private Sub frmMicheline_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        ' Active l'assistant au démarrage de l'appli
        tsbAssistant.Checked = True

        ' Création de l'assistant avec un premier message
        Assistant = New Assistant(300, 10)
        Assistant.Bienvenue()
        ' Puis démarrage de son timer d'animation
        AssistantTick.Start()
    End Sub

    Private Sub pbSimulation_MouseDown(sender As Object, e As MouseEventArgs) Handles pbSimulation.MouseDown
        ' On ne gère pas les clics quand la simulation est en cours
        If SimulationTick.Enabled Then Return

        ' Si une station est survolée
        If Simulation.IsStationHovered Then
            If tsbSupprimer.Checked Then
                If e.Button = Windows.Forms.MouseButtons.Left Then Simulation.DeleteHoveredStation()
            Else
                ' Si la touche Control est pressée
                If My.Computer.Keyboard.CtrlKeyDown Then
                    ' Si on a la combinaison Ctrl + clic gauche
                    If e.Button = Windows.Forms.MouseButtons.Left Then
                        ' Alors on affiche la fenêtre des caractéristiques de la station
                        frmStation.ShowDialog()
                    End If
                ElseIf e.Button = Windows.Forms.MouseButtons.Right Then
                    ' Si il n'y a pas de combinaison et juste un clic droit
                    ' Initie le déplacement de la station survolée
                    Simulation.StartMoving()
                    Assistant.CreerAiguillage()
                ElseIf e.Button = Windows.Forms.MouseButtons.Left Then
                    ' Sinon, si le bouton gauche est pressé
                    ' => créé une nouvelle station et initie le mouvement directement 
                    If Simulation.StartMovingLast() Then Simulation.AddStation(e.X, e.Y, "")
                    Assistant.Deplacer()
                End If
            End If
        ElseIf Simulation.IsJunctionHovered And e.Button = Windows.Forms.MouseButtons.Left Then
            If tsbSupprimer.Checked = True Then
                Simulation.DeleteHoveredJunction()
            Else
                ' Si une jonction est survolée et que le bouton gauche est pressé
                ' Créé un nouvel aiguillage
                Simulation.AddRailPoint(e.X, e.Y)
                Assistant.EditerTrains()
            End If
        ElseIf e.Button = Windows.Forms.MouseButtons.Left And Not tsbSupprimer.Checked Then
            ' Si le bouton gauche de la souris est enfoncé mais qu'aucune station n'est survolée
            ' alors on ajoute une station à la suite
            frmStationName.ShowDialog()
            Simulation.AddStation(e.X, e.Y, frmStationName.tbNomStation.Text)
            If Simulation.Stations.Count > 1 Then
                Assistant.CreerAiguillage()
            Else
                Assistant.PremierClic()
            End If

        End If
    End Sub

    Private Sub SimulationTick_Tick(sender As Object, e As EventArgs) Handles SimulationTick.Tick
        ' Permet à la simulation de... simuler au rythme du timer de simulation
        Simulation.Tick()
        pbSimulation.Refresh()
    End Sub

    Private Sub tsbDemarrer_Click(sender As Object, e As EventArgs) Handles tsbDemarrer.Click
        ' Active le timer de simulation, rafraichit l'état des boutons dans la barre d'outils
        If SimulationTick.Enabled = False Then
            SimulationTick.Enabled = True
        End If

        SimulationTick.Interval = 50

        tsbDemarrer.Enabled = False
        tsbAccelerer.Enabled = True
        tsbPause.Enabled = True
        tsbTrains.Enabled = False
        tsbNouvelleLigne.Enabled = False
        tsbSupprimer.Checked = False
        tsbSupprimer.Enabled = False

        Assistant.EditerSimulation()
    End Sub

    Private Sub tsbAccelerer_Click(sender As Object, e As EventArgs) Handles tsbAccelerer.Click
        ' Même chose qu'au dessus mais on veut que le timer soit plus rapide
        If SimulationTick.Enabled = False Then
            SimulationTick.Enabled = True
        End If

        SimulationTick.Interval = 10

        tsbDemarrer.Enabled = True
        tsbAccelerer.Enabled = False
        tsbPause.Enabled = True
        tsbTrains.Enabled = False
        tsbNouvelleLigne.Enabled = False
        tsbSupprimer.Checked = False
        tsbSupprimer.Enabled = False

        Assistant.EditerSimulation()
    End Sub

    Private Sub tsbPause_Click(sender As Object, e As EventArgs) Handles tsbPause.Click
        ' Arrête la simulation et permet l'édition
        If SimulationTick.Enabled = True Then
            SimulationTick.Enabled = False
        End If

        tsbDemarrer.Enabled = True
        tsbAccelerer.Enabled = True
        tsbPause.Enabled = False
        tsbTrains.Enabled = True
        tsbNouvelleLigne.Enabled = True
        tsbSupprimer.Enabled = True

        Assistant.CaracteristiqueStation()
    End Sub

    Private Sub tsbTrains_Click(sender As Object, e As EventArgs) Handles tsbTrains.Click
        frmTrain.ShowDialog()
        Assistant.Gomme()
    End Sub

    Private Sub tsbOuvrir_Click(sender As Object, e As EventArgs) Handles tsbOuvrir.Click
        ' Affiche un dialogue d'ouverture de fichier
        Dim openDialog As New OpenFileDialog()
        openDialog.Filter = "Simulations Micheline (*.mich)|*.mich"

        ' Si on sélectionné un fichier, on le charge
        If openDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Simulation.LoadFromFile(openDialog.FileName)
            pbSimulation.Refresh()
        End If
    End Sub

    Private Sub tsbEnregistrer_Click(sender As Object, e As EventArgs) Handles tsbEnregistrer.Click
        ' Affiche un dialogue d'enregistrement de fichier
        Dim saveDialog As New SaveFileDialog()
        saveDialog.Filter = "Simulations Micheline (*.mich)|*.mich"

        ' Si on spécifie un fichier pour l'enregistrement, on écrit dedans
        If saveDialog.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
            Simulation.SaveToFile(saveDialog.FileName)
        End If
    End Sub

    Private Sub tsbAssistant_Click(sender As Object, e As EventArgs) Handles tsbAssistant.Click
        ' Rafraichit l'affichage en cas de d'activation ou de désactivation de l'assistant
        pbSimulation.Refresh()
    End Sub

    Private Sub tsbNouvelleLigne_Click(sender As Object, e As EventArgs) Handles tsbNouvelleLigne.Click
        Simulation.NewLine()
    End Sub

    Private Sub frmMicheline_Resize(sender As Object, e As EventArgs) Handles MyBase.Resize
        ' Rafraichit l'affichage en cas de redimensionnement de la fenêtre (afin de positionner correctement l'assistant)
        pbSimulation.Refresh()
    End Sub
End Class
